home *** CD-ROM | disk | FTP | other *** search
/ OpenGL Superbible (2nd Edition) / OpenGL SuperBible e2.iso / tools / GLUT-3.7 / PROGS / advanced97 / SBIAS.C < prev    next >
Encoding:
C/C++ Source or Header  |  1998-08-12  |  4.4 KB  |  193 lines

  1. #include <assert.h>
  2. #include <math.h>
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <GL/glut.h>
  6. #include "texture.h"
  7.  
  8. static char defaultFile[] = "data/mandrill256.rgb";
  9. GLuint *img;
  10. GLsizei w, h;
  11. GLint comp;
  12.  
  13. GLfloat scale[] = {1, 1, 1}, bias[] = {0, 0, 0};
  14. GLboolean changeScale = 1, changeBias = 1;
  15. GLboolean changeR = 1, changeG = 1, changeB = 1;
  16.  
  17. void init(void)
  18. {
  19.   glDrawBuffer(GL_FRONT);
  20.   glReadBuffer(GL_BACK);
  21. }
  22.  
  23. void load_img(const char *fname)
  24. {
  25.   img = read_texture(fname, &w, &h, &comp);
  26.   if (!img) {
  27.     fprintf(stderr, "Could not open %s\n", fname);
  28.     exit(1);
  29.   }
  30. }
  31.  
  32. void reshape(GLsizei winW, GLsizei winH) 
  33. {
  34.     glViewport(0, 0, w, h);
  35.     glLoadIdentity();
  36.     glOrtho(0, winW, 0, winH, 0, 5);
  37. }
  38.  
  39. void draw(void)
  40. {
  41.     GLenum err;
  42.  
  43.     glPixelTransferf(GL_RED_SCALE, 1);
  44.     glPixelTransferf(GL_GREEN_SCALE, 1);
  45.     glPixelTransferf(GL_BLUE_SCALE, 1);
  46.     glPixelTransferf(GL_RED_BIAS, 0);
  47.     glPixelTransferf(GL_GREEN_BIAS, 0);
  48.     glPixelTransferf(GL_BLUE_BIAS, 0);
  49.  
  50.     glClear(GL_COLOR_BUFFER_BIT);
  51.     glDrawBuffer(GL_BACK);
  52.     glRasterPos2i(0, 0);
  53.     glDrawPixels(w, h, GL_RGBA, GL_UNSIGNED_BYTE, img);
  54.  
  55.  
  56.     glPixelTransferf(GL_RED_SCALE, scale[0]);
  57.     glPixelTransferf(GL_GREEN_SCALE, scale[1]);
  58.     glPixelTransferf(GL_BLUE_SCALE, scale[2]);
  59.     glPixelTransferf(GL_RED_BIAS, bias[0]);
  60.     glPixelTransferf(GL_GREEN_BIAS, bias[1]);
  61.     glPixelTransferf(GL_BLUE_BIAS, bias[2]);
  62.     glDrawBuffer(GL_FRONT);
  63.     glCopyPixels(0, 0, w, h, GL_COLOR);
  64.  
  65.     err = glGetError();
  66.     if (err != GL_NO_ERROR) printf("Error:  %s\n", gluErrorString(err));
  67. }
  68.  
  69. /* ARGSUSED1 */
  70. void key(unsigned char key, int x, int y)
  71. {
  72.   char change[][30] = {"Not changing", "Changing"};
  73.  
  74.   switch(key) {
  75.   case 27:
  76.     exit(0);
  77.   case 's':  case 'S':
  78.     changeScale = (changeScale == 0);
  79.     printf("%s scale\n", change[changeScale]);
  80.     break;
  81.   case 'i':  case 'I':
  82.     changeBias = (changeBias == 0);
  83.     printf("%s bias\n", change[changeBias]);
  84.     break;    
  85.   case 'r':  case 'R':
  86.     changeR = (changeR == 0);
  87.     printf("%s red channel\n", change[changeR]);
  88.     break;
  89.   case 'g':  case 'G':
  90.     changeG = (changeG == 0);
  91.     printf("%s green channel\n", change[changeG]);
  92.     break;
  93.   case 'b':  case 'B':
  94.     changeB = (changeB == 0);
  95.     printf("%s blue channel\n", change[changeB]);
  96.     break;
  97.   case ' ':
  98.     changeScale = changeBias = changeR = changeG = changeB = 1;
  99.     scale[0] = scale[1] = scale[2] = 1;
  100.     bias[0] = bias[1] = bias[2] = 0;
  101.     printf("Resetting all\n");
  102.     draw();
  103.     break;
  104.   case '?':
  105.     printf("Scale:\n");
  106.     printf("\tR:  %f\n", scale[0]);
  107.     printf("\tG:  %f\n", scale[1]);
  108.     printf("\tB:  %f\n", scale[2]);
  109.     printf("Bias:\n");
  110.     printf("\tR:  %f\n", bias[0]);
  111.     printf("\tG:  %f\n", bias[1]);
  112.     printf("\tB:  %f\n\n", bias[2]);
  113.   }
  114. }
  115.  
  116. int lastX, lastY, curX, curY;
  117.  
  118. void idle(void)
  119. {
  120.   float dScale, dBias;
  121.  
  122.   if (lastX != curX || lastY != curY) {
  123.     if (changeScale) {
  124.       dScale = (curX - lastX) / (float)w;
  125.       if (changeR) scale[0] += dScale;
  126.       if (changeG) scale[1] += dScale;
  127.       if (changeB) scale[2] += dScale;
  128.     }
  129.     if (changeBias) {
  130.       dBias = (curY - lastY) / (float)h;
  131.       if (changeR) bias[0] += dBias;
  132.       if (changeG) bias[1] += dBias;
  133.       if (changeB) bias[2] += dBias;
  134.     }      
  135.  
  136.     glPixelTransferf(GL_RED_SCALE, scale[0]);
  137.     glPixelTransferf(GL_GREEN_SCALE, scale[1]);
  138.     glPixelTransferf(GL_BLUE_SCALE, scale[2]);
  139.     glPixelTransferf(GL_RED_BIAS, bias[0]);
  140.     glPixelTransferf(GL_GREEN_BIAS, bias[1]);
  141.     glPixelTransferf(GL_BLUE_BIAS, bias[2]);
  142.  
  143.     glRasterPos2i(0, 0);
  144.     glCopyPixels(0, 0, w, h, GL_COLOR);
  145.  
  146.     lastX = curX;
  147.     lastY = curY;
  148.   }
  149. }
  150.  
  151. void motion(int xpos, int ypos)
  152. {
  153.   curX = xpos;
  154.   curY = (h - ypos);
  155. }
  156.  
  157. /* ARGSUSED */
  158. void button(int button, int state, int xpos, int ypos)
  159. {
  160.   if (state == GLUT_DOWN) {
  161.     glutIdleFunc(idle); 
  162.     curX = lastX = xpos;
  163.     curY = lastY = (h - ypos);
  164.     return;
  165.   } else {
  166.     glutIdleFunc(0);
  167.   }
  168. }
  169.  
  170. main(int argc, char *argv[])
  171. {
  172.     glutInit(&argc, argv);
  173.     if (argc > 1) {
  174.       load_img(argv[1]);
  175.     } else {
  176.       load_img(defaultFile);
  177.     }
  178.     glutInitWindowSize(w, h);
  179.     glutInitWindowPosition(0, 0);
  180.     glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
  181.     glutCreateWindow(argv[0]);
  182.     glutDisplayFunc(draw);
  183.     glutKeyboardFunc(key);
  184.     glutReshapeFunc(reshape);
  185.     glutMouseFunc(button);
  186.     glutMotionFunc(motion);
  187.     init();
  188.  
  189.     glutMainLoop();
  190.     return 0;
  191. }
  192.  
  193.